2026-10-18T12:09:00.4761280Z ##[group]Run npm run test:deploy
2026-10-18T12:09:00.4761328Z [36;1mnpm run test:deploy[0m
2026-10-18T12:09:00.4761345Z shell: /usr/bin/bash -e {0}
2026-10-18T12:09:00.4761359Z env:
2026-10-18T12:09:00.4761371Z   CARGO_TERM_COLOR: never
2026-10-18T12:09:00.4761389Z   WRANGLER_SEND_METRICS: false
2026-10-18T12:09:00.4761401Z ##[endgroup]
2026-10-18T12:09:00.6139099Z 
2026-10-18T12:09:00.6139238Z > test:deploy
2026-10-18T12:09:00.6139276Z > node --test "scripts/deploy/*.test.mjs"
2026-10-18T12:09:00.6139328Z 
2026-10-18T12:09:00.7669148Z ✔ a release's version bump keeps the Rust caches' key, a new dependency changes it (2.224097ms)
2026-10-18T12:09:00.7669282Z ✔ the toolchain is read from rustc -V (0.28022ms)
2026-10-18T12:09:00.7670497Z ✔ the CLI's builder image is pinned, and keys its cache by its digest (0.322224ms)
2026-10-18T12:09:00.7673373Z ✔ a unit's hash is read from its files and folders (0.394673ms)
2026-10-18T12:09:00.7679240Z ✔ only the units the build did not use are pruned (2.879921ms)
2026-10-18T12:09:02.5132157Z error: no matching package named `base64` found
2026-10-18T12:09:02.5136846Z location searched: crates.io index
2026-10-18T12:09:02.5138288Z required by package `g1t-api v0.1.0 (/home/runner/work/repo/apps/api)`
2026-10-18T12:09:02.5140224Z note: offline mode (via `--offline`) can sometimes cause surprising resolution failures
2026-10-18T12:09:02.5141820Z help: if this error is too confusing you may wish to retry without `--offline`
2026-10-18T12:09:03.1192704Z ✔ the manifest matches every wrangler config in the repository (37.481388ms)
2026-10-18T12:09:03.1192837Z ✔ every wrangler.jsonc is found, and only checked-in ones (28.004258ms)
2026-10-18T12:09:03.1192943Z ✔ problems are found: an unlisted config, a later-stage binding, a wrong database, an unnamed KV (42.606718ms)
2026-10-18T12:09:03.1193014Z ✔ stages follow bindings: nothing binds to a unit that ships after it (1.046551ms)
2026-10-18T12:09:03.1193081Z ✔ inside a stage, a Worker that does not exist yet goes before those bound to it (1.311989ms)
2026-10-18T12:09:03.1193144Z ✔ Rust workers build with the shared script and the same wasm-opt level (0.990747ms)
2026-10-18T12:09:03.1193202Z ✔ shared crates and packages are read from workspace metadata (0.275623ms)
2026-10-18T12:09:03.1193274Z ✔ the runner's image is built from the runner crate and what it uses, on the base its lock names (0.398458ms)
2026-10-18T12:09:03.1193341Z ✔ services/runner/base.json records the base its folder builds (14.005264ms)
2026-10-18T12:09:03.1193404Z ✔ an image's hash ignores line endings, and its tags say what they are (124.403789ms)
2026-10-18T12:09:03.1193462Z ✔ only the lockfile entries the runner is built from name its image (0.515864ms)
2026-10-18T12:09:03.1193518Z ✔ the runner's deploy config names its image by reference, beside its wrangler.jsonc (23.68636ms)
2026-10-18T12:09:03.1193572Z ✔ the registry is asked for an image's manifest, without Docker (1.072609ms)
2026-10-18T12:09:03.1193628Z ✔ a push counts only when it ends with a digest, and is tried again (1.00595ms)
2026-10-18T12:09:03.1193680Z ✔ a static Linux binary is told from a dynamic one (0.911818ms)
2026-10-18T12:09:03.1193758Z ﹣ path dependencies agree with Cargo's own resolved graph (1048.314762ms) # cargo metadata could not resolve offline
2026-10-18T12:09:03.1194236Z ✔ every import that leaves a unit's folder is covered by its dependencies or inputs (77.328366ms)
2026-10-18T12:09:03.1194295Z ✔ a shared crate's change reaches every unit built from it, and no other (0.827932ms)
2026-10-18T12:09:03.1194352Z ✔ a shared package's change reaches what imports it (0.307602ms)
2026-10-18T12:09:03.1194411Z ✔ a crate's tests, benches and examples deploy nothing (0.593952ms)
2026-10-18T12:09:03.1194470Z ✔ a Rust file compiled only for tests is found from what declares it (1.512469ms)
2026-10-18T12:09:03.1194523Z ✔ this repository's test-only sources are read from git (273.155771ms)
2026-10-18T12:09:03.1194580Z ✔ decide: a change only to tests deploys nothing (1.941653ms)
2026-10-18T12:09:03.1194634Z ✔ own folders, declared inputs and root files (0.787151ms)
2026-10-18T12:09:03.1194689Z ✔ a Cargo.lock change reaches only crates that use what changed (0.755634ms)
2026-10-18T12:09:03.1194744Z ✔ a package-lock change reaches through workspace links (1.409435ms)
2026-10-18T12:09:03.1194795Z ✔ decide: changed units deploy, others wait, unknown ones deploy (0.398318ms)
2026-10-18T12:09:03.1194857Z ✔ decide: --force deploys unchanged units; a commit missing from history deploys (0.216124ms)
2026-10-18T12:09:03.1194912Z ✔ decide: Cargo.lock counts only where it reaches (0.810507ms)
2026-10-18T12:09:03.1194970Z ✔ decide: the runner's image rebuilds only when what it is built from changed (0.311748ms)
2026-10-18T12:09:03.1195031Z ✔ the plan as data: migrations, and each stage's units in jobs that share a build (1.582986ms)
2026-10-18T12:09:03.1195082Z ✔ units are picked by short name, folder or Worker name (0.563736ms)
2026-10-18T12:09:03.1195758Z ✔ a CI job installs only what its units need (1.228994ms)
2026-10-18T12:09:03.1195811Z ✔ a deploy is annotated with its commit, and read back (0.47953ms)
2026-10-18T12:09:03.1195867Z ✔ the live commit: the live version's, looking through secret changes (0.393661ms)
2026-10-18T12:09:03.1195924Z ✔ Wrangler's output: pending migrations and the version a deploy made (0.336145ms)
2026-10-18T12:09:03.1195980Z ✔ the API's answers: the live commit as Wrangler's would give it (1.255233ms)
2026-10-18T12:09:03.3853594Z ✔ the API's answers: a Worker never deployed, and a refusal, never throw (501.838884ms)
2026-10-18T12:09:03.3855075Z ✔ the API is used only with the token Wrangler would be given (0.405618ms)
2026-10-18T12:09:03.3857523Z ✔ pending migrations: the folder's files less the names in d1_migrations (1.749055ms)
2026-10-18T12:09:03.4588448Z ✔ the pool runs everything, no more than its limit at once (15.943112ms)
2026-10-18T12:09:03.4588751Z ✔ self-hosting builds every Rust service the manifest says it runs (0.678929ms)
2026-10-18T12:09:03.4588804Z ✔ the self-hosting architecture page names every unit (0.274662ms)
2026-10-18T12:09:03.4602468Z ✔ the architecture's services page names every unit, with the services it binds to (3.630428ms)
2026-10-18T12:09:03.4604280Z ✔ resolveStack works on a manifest with no workspace crates or packages (5.159812ms)
2026-10-18T12:09:03.4606225Z ✔ decide: a commit older than what runs is never deployed by accident, even forced; --rollback means it (0.276856ms)
2026-10-18T12:09:03.4608119Z ✔ a deploy by hand reports to the repository on g1t, and a workflow's does not (1.712019ms)
2026-10-18T12:09:03.4636155Z ✔ a failed wrangler command is reported by its error, not its trace (0.207582ms)
2026-10-18T12:09:03.4662876Z ✔ Cloudflare failing is tried again; a mistake in what is deployed is not (0.371538ms)
2026-10-18T12:09:03.4666368Z ✔ sandboxes roll over at once when their image or container settings changed, and not otherwise (0.222664ms)
2026-10-18T12:09:03.4686479Z ✔ the deploy tool itself parses: a test that never imports it would not notice (44.135162ms)
2026-10-18T12:09:04.1352048Z ✔ the statements are all there (1.401343ms)
2026-10-18T12:09:04.1353371Z ✔ twenty invites each: the twenty-first is refused in the statement that writes (84.506166ms)
2026-10-18T12:09:04.1354016Z ✔ revoking an unused invite gives it back; an expired one never counted (166.655715ms)
2026-10-18T12:09:04.1358715Z ✔ a used invite is spent: revoking it does nothing and it still counts (88.86146ms)
2026-10-18T12:09:04.1367186Z ✔ a pending invite for the same address is found; a revoked one is not (79.315718ms)
2026-10-18T12:09:04.1373269Z ✔ staff grants add to the twenty and can take some back (73.177778ms)
2026-10-18T12:09:04.1384081Z ✔ signing up from the link spends the invite once and records who invited whom (66.896644ms)
2026-10-18T12:09:04.2424205Z ✔ a body that broke off is worth another try, a lockfile out of step is not (2.2394ms)
2026-10-18T12:09:04.2433991Z ✔ an install that ends without saying why, or stalls, is tried again (0.277126ms)
2026-10-18T12:09:04.2441517Z ✔ a dropped connection is tried again until the install passes (3.028384ms)
2026-10-18T12:09:04.2464850Z ✔ a real error fails at once (0.498938ms)
2026-10-18T12:09:04.2464994Z ✔ it gives up after its tries, with npm's exit code (0.481072ms)
2026-10-18T12:09:04.2465030Z ✔ a stalled install is run again (0.384797ms)
2026-10-18T12:09:04.5274408Z ✔ webhooks: the hourly purge deletes old deliveries by time (4.8855ms)
2026-10-18T12:09:04.5292600Z ✔ billing: this month's users are read from an index, not the ledger (108.505185ms)
2026-10-18T12:09:04.5312776Z ✔ events: a repository's events of one type, newest first, page by page (7.902778ms)
2026-10-18T12:09:04.5315963Z ✔ actions: a self-hosted runner's poll finds queued jobs by namespace, whatever its case (27.527293ms)
2026-10-18T12:09:04.5333124Z ✔ chat: a channel's messages and a thread's replies, newest first, page by page (4.906191ms)
2026-10-18T12:09:04.5333232Z ✔ chat: the sidebar's unread messages are read from each channel's index, after the last read (4.61883ms)
2026-10-18T12:09:04.5334399Z ✔ chat: a page's reactions are read by message, and a workspace's emoji by name (5.314604ms)
2026-10-18T12:09:04.7352405Z ✔ the runner's layer is the binary alone, at its path and mode, owned by root (9.727235ms)
2026-10-18T12:09:04.7353420Z ✔ the layer and entrypoint are what services/runner/Dockerfile builds (0.73334ms)
2026-10-18T12:09:04.7354440Z ✔ the config is the base's, with the layer, the entrypoint and no inherited command (1.550356ms)
2026-10-18T12:09:04.7359817Z ✔ the manifest names the base's layers, then the binary's, in the base's format (0.687332ms)
2026-10-18T12:09:04.7389543Z ✔ image references and bearer challenges are read (1.077867ms)
2026-10-18T12:09:04.7409187Z ✔ the runner's image is made in the registry from the base's manifest and one new layer, pulling none of the base (43.698456ms)
2026-10-18T12:09:04.7409493Z ✔ a base that is not where it should be, or not what base.json says, stops it (2.042816ms)
2026-10-18T12:09:04.7443797Z ✔ a registry that asks for a bearer token is given the one its realm trades the credentials for (3.946792ms)
2026-10-18T12:09:04.8610924Z scheduler: g1t-webhooks (* * * * *) is still running from the last time; skipped
2026-10-18T12:09:04.9263928Z scheduler: g1t-webhooks (* * * * *): 200 {"outcome":"exception"}
2026-10-18T12:09:04.9318260Z ✔ fields read numbers, ranges, lists and steps (3.257438ms)
2026-10-18T12:09:04.9319023Z ✔ the services' crons match when hosted g1t's would fire (3.6323ms)
2026-10-18T12:09:04.9327596Z ✔ what is due is each matching cron of each service (0.888152ms)
2026-10-18T12:09:04.9337716Z ✔ a run asks Wrangler for the handler, and a slow one is not doubled (64.614259ms)
2026-10-18T12:09:05.0743914Z ✔ a deploy is announced to status.g1t.sh with the token, and without one nothing is sent (38.340417ms)
2026-10-18T12:09:05.2736000Z ✔ an announcement that fails is a warning, never a failed deploy (0.705379ms)
2026-10-18T12:09:05.2736142Z ✔ the stages run inside the window: started before, finished after, even when they throw; a dry run says nothing (0.938919ms)
2026-10-18T12:09:05.2736205Z ✔ deploy.mjs announces every deploy, and the workflow passes it the token (0.622023ms)
2026-10-18T12:09:05.2736259Z ✔ discover actual hashed assets without archiving icons, source maps or library defaults (2.371829ms)
2026-10-18T12:09:05.2736315Z ✔ archive the old release's transitive chunks before replacing it (28.653422ms)
2026-10-18T12:09:05.2736364Z ✔ archive failures block cutover and immutable filename collisions are refused (3.671338ms)
2026-10-18T12:09:05.2736412Z ✔ a missing live asset aborts the archive instead of saving an HTML error as CSS (0.95278ms)
2026-10-18T12:09:05.2736469Z ✔ a release manifest skips unchanged uploads without scanning deployment history (1.110065ms)
2026-10-18T12:09:05.2736542Z ✔ provider rate limits wait and retry; persistent failure remains a failure (1.408384ms)
2026-10-18T12:09:05.2736607Z ✔ cutover verifies old and new assets and rejects HTML fallback or wrong build (3.143536ms)
2026-10-18T12:09:05.2736664Z ✔ cutover tolerates propagation delay but still requires the expected build and asset bytes (2.769415ms)
2026-10-18T12:09:07.1873120Z ✔ 1000 successive releases keep old tabs' assets and perform bounded incremental archive work (1926.6485ms)
2026-10-18T12:09:07.2120291Z ℹ tests 101
2026-10-18T12:09:07.2120414Z ℹ suites 0
2026-10-18T12:09:07.2120435Z ℹ pass 100
2026-10-18T12:09:07.2120449Z ℹ fail 0
2026-10-18T12:09:07.2120636Z ℹ cancelled 0
2026-10-18T12:09:07.2120649Z ℹ skipped 1
2026-10-18T12:09:07.2120664Z ℹ todo 0
2026-10-18T12:09:07.2121767Z ℹ duration_ms 6549.975384
